package qc.module.qms.service.rawdata;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.module.qms.entity.QmsRawdataMapElement;
import qc.module.qms.entity.QmsRawdataMapStation;

import java.util.List;
import java.util.stream.Collectors;

/**
 * QMS中原始数据对应关系获取Service，包含原始数据对应站点和对应监测要素的获取方法
 *
 * @author QuCheng Tech
 * @since 2025/10/1
 */
@Service
public class QmsRawDataMapGetService {
    private static final Logger logger = LoggerFactory.getLogger(QmsRawDataMapGetService.class);

    @Autowired
    private QmsRawDataMapStationService rawdataMapStationService;

    @Autowired
    private QmsRawDataMapElementService rawdataMapElementService;

    /**
     * 根据指定的表编码和原始站点编码获取站点对应关系，有缓存时从缓存中获取
     * 在同一个原始数据表中，一个原始数据站点编码只能至多对应一个监测系统中的站点编码
     *
     * @param tbcode  表编码
     * @param rawstcd 原始站点编码
     * @return qc.module.qms.entity.QmsRawdataMapStation
     * @author QuCheng Tech
     * @since 2025/9/11
     */
    public QmsRawdataMapStation getRawDataMapStationByRawStcd(String tbcode, String rawstcd) {
        if (StringUtils.isNotBlank(tbcode) && StringUtils.isNotBlank(rawstcd)) {
            List<QmsRawdataMapStation> allStations = rawdataMapStationService.getAllWithCache();
            if (allStations != null && allStations.size() > 0x0) {
                List<QmsRawdataMapStation> filterByRawStcdStations = allStations.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getTbcode(), tbcode) && StringUtils.equalsIgnoreCase(p.getRawstcd(), rawstcd)).collect(Collectors.toList());
                if (filterByRawStcdStations != null && filterByRawStcdStations.size() > 0x0) {
                    //可以有多个对应关系，返回第一个非禁用状态的对应关系
                    for (QmsRawdataMapStation station : filterByRawStcdStations) {
                        if (station.getIsdisable() == false)
                            return station;
                    }

                    //如果均为禁用状态，返回第一个
                    return filterByRawStcdStations.get(0x0);
                }
            }
        }

        return null;
    }

    /**
     * 根据指定的表编码和列名称获取采集要素对应关系，有缓存时从缓存中获取
     * 在同一个原始数据表中，一列数据可以对应一个或多个监测系统中的要素编码（如列value可以对应水位站的水位、也可以对应水量站的水量或雨量站的雨量值）
     *
     * @param tbcode     表编码
     * @param columnCode 列名称
     * @return qc.module.qms.entity.QmsRawdataMapElement
     * @author QuCheng Tech
     * @since 2025/9/11
     */
    public QmsRawdataMapElement getRawdataMapElementByRawColumn(String tbcode, String columnCode) {
        if (StringUtils.isNotBlank(tbcode) && StringUtils.isNotBlank(columnCode)) {
            List<QmsRawdataMapElement> allElements = rawdataMapElementService.getAllWithCache();
            if (allElements != null && allElements.size() > 0x0) {
                //此处需要修改为获取所有的未禁用的对应关系
                List<QmsRawdataMapElement> filterByRawColumnElements = allElements.stream().filter(p -> StringUtils.equalsIgnoreCase(p.getTbcode(), tbcode) && StringUtils.equalsIgnoreCase(p.getColumncode(), columnCode)).collect(Collectors.toList());
                if (filterByRawColumnElements != null && filterByRawColumnElements.size() > 0x0) {
                    //可以有多个对应关系，返回第一个非禁用状态的对应关系
                    for (QmsRawdataMapElement ele : filterByRawColumnElements) {
                        if (ele.getIsdisable() == false)
                            return ele;
                    }

                    //如果均为禁用状态，返回第一个
                    return filterByRawColumnElements.get(0x0);
                }
            }
        }

        return null;
    }
}
